package com.csw.shuanfa.SuanFa;

/**
 * (1)n=500, k=30, p=5
 * (2)n=500, k=30, p=16
 * <p>
 * 1.
 * n是小区人数，k是第一天感染者人数，p是转运力。每过一天，转运力就会下降一人，如果没有及时被转走，剩下的感染人数第二天会翻倍。
 * 问能不能实现感染者清零，带入上述1，2，数字
 * 如果能至少需要多少天
 * <p>
 * 2 接上一题，如果要确保最后小区能清零，即在转运能力减到0之前，所有感染者都能被转运出去，p的最小值是多少。即基于小区居民n，第一天感染人数k，求出p的最小值。用Java/JS/TS/C++语言实现求p最小值的函数。
 * 要求：
 * (1) 命名一个合适的函数名称，实现完整的函数
 * (2) 按照你平时的编程习惯，在你认为需要注释处写上相应的注释
 */
public class TestGrzy {


    public static void main(String[] args) {
        int k = 30;
        int zm = 550;

        int day = 0;
        Integer pn = countK(zm, k, 16, day);


        /**
         *
         * k-p
         * (k-p)*2-(p-1)=2k-2p-p+1=2k-3p+1
         * 2(2k-3p+1)-(p-2)=4k-6p+2-p+2=4k-7p+4
         *
         *
         *
         */

    }

    public static Integer countK(int zm, int k, int p0, int day) {
        day++;
        System.out.print("第day" + day);
        System.out.print("[上一天未感染居民k]" + zm);

        System.out.print("[感染者k]" + k);
        if (day == 1) {
            zm = zm - k;
        }
        int pn = p0 - day + 1;
        System.out.print("[转运力pn]" + pn);
        k = k - pn;//转运后剩余

        //[剩余感染人数k]" + k);
        if (pn <= 0 && k > 0) {
            //转运失败");
            return null;
        }

        if (k > 0) {
            if (day != 1) {
                zm = zm - k;
            }
            //剩余未被感染的居民，上一天剩余未被感染减去
            if (zm < 0) {
                zm = 0;
            }
            int k0;
            //又被感染了k
            if (zm >= k) {
                k0 = 2 * k;
            } else {
                k0 = zm + k;
            }
            Integer bb = countK(zm, k0, p0, day);
            if (bb == null) {
                return null;
            }
        }
        return 1;
    }
}

class Test2 {
    public static void main(String[] args) {
        int k = 30;
        int zm = 500;

        for (int p0 = 1; p0 <= k; p0++) {
            int day = 0;//清零天数
            Integer pn = TestGrzy.countK(zm, k, p0, day);
            //pn" + pn);
            if (pn != null) {
                //至少需要】" + p0);
                break;
            }
        }
    }


}
